package com.hspedu.synchronized_;

/**
 * @author LiuJinTao
 * @className DeadLock
 * @date 2024/06/23 20:30
 * @description 模拟线程死锁
 */
public class DeadLock {
    public static void main(String[] args) {
        DeadLockDemo A = new DeadLockDemo(true);
        A.setName("A线程");
        DeadLockDemo B = new DeadLockDemo(false);
        B.setName("B线程");
        A.start();
        B.start();
    }
}


class DeadLockDemo extends Thread {
    static Object o1 = new Object();// 保证多线程共享一个对象，这里使用 static
    static Object o2 = new Object();
    boolean flag;

    public DeadLockDemo(boolean flag) {
        this.flag = flag;
    }

    // 如果 flag 为 T，线程 A 就会先得到/持有 o1 对象锁，然后尝试获取 o2 对象锁
    // 如果线程 A 得不到 o2 对象锁，就会 Blocked
    // 如果 flag 为 F，线程 B 就会先得到/持有 o2 对象锁，然后尝试获取 o1 对象锁
    // 如果线程 B 得不到 o1 对象锁，就会 Blocked
    @Override
    public void run() {
        if (flag) {
            synchronized (o1) {
                System.out.println(Thread.currentThread().getName() + " 进入1");
                synchronized (o2) {// 这里获得 li 对象的监视权
                    System.out.println(Thread.currentThread().getName() + " 进入2");
                }
            }
        } else {
            synchronized (o2) {
                System.out.println(Thread.currentThread().getName() + " 进入3");
                synchronized (o1) {// 这里获得 li 对象的监视权
                    System.out.println(Thread.currentThread().getName() + " 进入4");
                }
            }
        }
    }
}